#============================================
#知识点(大多了解)
#============================================
# 触发器(了解)
# 在满足对表数据进行增、删、改的情况下，自动触发的功能
# 使用触发器可以帮助我们实现监控、日志...
# 触发器可以在六种情况下自动触发增前增后删前删后改前改后
# 基本语法结构
# create trigger 触发器的名字before/after insert/update/de1ete on 表名
# for each row
# begin
#  sql语句
# end
# 具体使用甘对触发墨的名字我们通常需要做到见名知在，
# create trigger tri_before_insert_t1 on t1
# for each row
# begin
#  sql语句
# end
#针对删和增一样
#--------------------------------------------
# ps:修改MySQL默认的语句结束符只作用 于当前窗口
# delimiter $$
# 将默认的结束符号由;改为$$
#案例
# CREATE TABLE cmd (
# id int primary key auto_increment，
# USER CHAR (32),
# priv CHAR (10),
# cmd CHAR (64) ,
# sub_time datetime，#提交时间
# success enum
# ('yes', 'no') #0代表执行失败
# );

# CREATE TABLE err1og (
# id int primary key auto_increment,
# err_ .cmd CHAR (64)，
# err_ time datetime
# );


# 当cmd表中的记录succes字段是no那么就触发触发器的执行去err1og表中插入数据
# NEW指代的就是一条条数据对象
# delimiter $$
# create trigger tri_after_insert_cmd after insert on cmd
# for each row
# begin
#   if NEW. success = 'no' then
#   insert into errlog(err_ .cmd,err. time)
#    values (NEW. cmd,NEW.sub_ _time);
#   end if;
# end $$
# delimiter ;

# 删除触发器
# drop trigger tri_after_insert_cmd;
#============================================
# 事务(了解)
# 什么是事务?
# 开启一个事务可以包含多条sq1语句这些sq1语句要么同时成功
# 要么一个都别想成功称之为事务的原子性

# 保证了对数据操作的安全性
# egon :还钱的例子
# egon用银行卡给我的支付宝转账1000
# 1将egon银行卡账户的数据减1000块
# 2将jason 支付宝账户的数据加1000块
# 你在操作多条数据的时候可能会出现某几条操作不成功的情况

# 事务的四大特性
# ACID
# A:原子性:
# 一一个事务是一一个不可分割的单位，事务中包含的诸多操作要么同时成功要么同时失败
# C:一致性:
# 事务必须是使数据库从一个一致性的状态变到另外一个一 致性的状态一致性跟原子性是密切相关的
# I:隔离性:
# 一一个事务执行不能被其他事务干扰
# D:持久性:
# 也叫"永久性"
# 一个事务.旦提交成功执行成功那么它对数据库中数据的修改应该是永久的
# 接下来的其他操作或者故障不应该对其有任何的影响
#-------------------------------------------
# 如何使用事务
#事务相关的关键字
# 1开启事务
# start transaction;
# 2回滚(回到事务执行之前的状态)
# rollback;
#3确认(确认之后就无法回滚了)
# commit;


# "模拟转账功能"
# create table user(
# id int primary key auto_increment,
# name char(16)， 
# balance int
# );

# insert into user(name,balance) values
# (' jason' , 1000)，
# (' egon'，1000)，
# ('tank' ,1000);

# 1先开启事务
# start transaction; 
# 2多条sq1语句
# update user set balance=900 where name= 'jason' ;
# update user set balance=1010 where name= ' egon ' ;
# update user set balance=1090 where name= ' tank' ;

# 总结
# 当你想让多条sq1语句保持一-致性要么同时成功要么同时失败
# 你就应该考虑使用事务
#============================================
# 存储过程(了解)
# 存储过程就类似于python中的自定义函数
# 它的内部包含了-系列可以执行的sg|语句,存储过程存放于MySQL服务端中，你可以
# 直接通过调用存储过程触发内部sgl语句的执行
# 基本使用
# create procedure 存储过程的名字()
# begin
#   sq1代码
# end
#调用
# ca11存储过程的名字();

# 三种开发
# 第一种
# 应用程序:程序员写代码开发
# MySQL :提前编写好存储过程，供应用程序调用
# 好处:开发效率提升了执行效率也上去了
# 缺点:考虑到认为元素、跨部门沟通的问题后续的存 储过程的扩展性差

# 第二种
# 应用程序:程序员写代码开发之外设计到数据库操作也自己动手写
# 优点:扩展性很高
# 缺点:开发效率降低，编写sq1语句太过繁琐而且后续还需要考虑sq1优化的问题

# 第三种
# 应用程序:只写程序代码不写sql语句基于别人写好的操作MySQL的python框架直接调用操
# 作即可
# ORM框架
# 优点:开发效率比上面两种情况都要高
# 缺点:语句的扩展性差可能会出现效率低下的问题


# delimiter $$
# create procedure p1(
# in m int， #只进不出 m不能返回出去
# in n int,
# out res int #该形参可以返回出去
# )
# begin
# select tname from teacher where tid>m and tid<n;
# set res=666; #将res变量修改用来标识当前的存储过程代码确实执行了
# end
# $$
# delimiter ;
#针对形参res不能直接传数据应该传一一个变量名
#定义变量
# set @ret = 66
#查看对应的值
# select @ret 
#============================================
# 函数
# 跟存储过程是有区别的，存储过程是自定义函数,函数就类似于是内置函数
# NOW()
# select date_format(sub_time, '%Y-%m')count(id) from b1og group by
# date_format(sub_ _time,'%Y-%m');
#============================================
# 流程控制(了解)
# # if判断
# delimiter //
# CREATE PROCEDURE proc _if ()
# BEGIN
    # declare i int defau1t 0;
    # ifi=1THEN
        # SELECT 1;
    # ELSEIF i = 2 THEN
        # SELECT 2;
    # ELSE
        # SELECT 7;
    # END IF;
# END //
# de1imiter ;


# while循环
# delimiter //
# CREATE PROCEDURE proc. _while ()
# BEGIN
# DECLARE num INT ;
# SETnum=0;
# WHILE num < 10 DO
# SELECT
# num ;
# SETnum=num+1;
# END WHILE ;
#============================================
# 索引
# ps:数据都是存在与硬盘上的，查询数据不可避免的需要进行I0操作
# 索引:就是一种数据结构，类似于书的目录。意味着以后在查询数据的应该先找目录再找
# 数据，而不是-页-页的翻书，从而提升查询速度降低IO操作
# 索弓|在MySQL中也叫“键' ,是存储弓|擎用于快速查找记录的一种数据结构
# primary key
# unique key
# index key 
# 注意foreign key不是铼加速查询用的，不在我们的而研究范围之内
# 上面的三种key,前面两种除了可以增加查询速度之外各自还具有约束条件
# 最后一种index key没有任何的约束条件,只是用来帮助你快速查询数据

# 本质
# 通过不断的缩小想要的数据范围筛选出最终的结果，同时将随机事件(-页-页的翻)
# 变成顺序事件(先找目录、找数据)
# 也就是说有了索引机制，我们可以总是用一种固定的方式查找数据
# 一张表中可以有多个索引多个录)
# 索弓|虽然能够帮助你加快查询速度但是也有缺点

# 索引虽然能够帮助你加快查询速度但是也有缺点
# 1当表中有大量数据存在的前提下创建索引速度会很慢
# 2在索引创建完毕之后对表的查询性能会大幅度的提升但是写的性能也会大幅度的降低
# 索引不要随意的创建! ! ! 


# b+树
# 只有叶子节点存放的是真实的数据其他节点存放的是虚拟数据仅仅是用来指路的
# 树的层级越高查询数据所需要经历的步骤就越多(树有几层查询数据就需要几步)
# 一“个磁盘块存储是有限制的
# 为什么建议你将id字段作为索引
# 占得空间少一“个磁盘块能够存储的数据多
# 那么久降低了树的高度从而减少查询次数


# 聚集索引(primary key)
# 聚集索引指的就是主键
# 只有两个文件
# 直接将主键存放在了idb表中
# MyIsam
# 三个文件单独将索引存在一 一个文件

# 辅助索引(unique,index)
# 查询数据的时候不可能一直使用到主键, 也有可能会用到name,password等其他字段
# 那么这个时候你是没有办法利用聚集索引。这个时候你就可以根据情况给其他字段设置
# 辅助索引(也是一个b+树)
# 叶子节点存放的是数据对应的主键值
# 先按照辅助索引拿到数据的主键值
# 之后还是需要去主键的聚集索引里面查询数据

# 覆盖索引
# 在辅助索弓|的叶子节点就已经拿到了需要的数据
# #给name设置辅助索引
# select name from user where name= ' jason' ;
# #非覆盖索引
# select age from user where name= " jason' ;

